/**
 * AjustesPanl.java
 * @author Paulo Chang, Carnet 11076
 * @author Oscar Castañeda, Carnet 11086
 * @author Francisco Martínez, Carnet 11096
 * @since 05/11/2011
 * Modificado por última vez el 13/11/2011.
 * Descripción: Clase de interfaz gráfica que permite al usuario realizar distintos
 * cambios en su programa, tales como crear y eliminar categorías, reiniciar la billetera
 * virtual o cambiar la contraseña maestra.
 */


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;


public class AjustesPanel extends JPanel {

   //Atributos
    private ConexionBD baseDatos;
    private ControlCategoria categoriasHechas;
    private CategoriasPanel panelCategorias;
    private Opciones opciones;
    private String contrasenaEncriptada;
    private StringEncrypter encriptador;
    
    /**
     * Crea un nuevo panel de ajustes, con todos los componentes que lo conforman.
     * @param conexion ConexionBD que permite interactuar con la base de datos.
     * @param categoriasExistentes ControlCategoria que permite conocer las categorías existentes.
     * @param panel CategoriasPanel donde se muestran todas las categorías existentes y sus tablas.
     * @param adicionales Opciones que lleva control de las tablas existentes. 
     * @param claveSecreta String con la contraseña del ususario encriptada.
     * @param encriptador StringEncrypter que sirve para encriptar y desencriptar los datos.
     */
     
    public AjustesPanel(ConexionBD conexion, ControlCategoria categoriasExistentes, CategoriasPanel panel, Opciones adicionales, String claveSecreta, StringEncrypter encriptador) {
        initComponents();
        //Se almacenan los parámetros como atibutos.
        baseDatos = conexion;
        categoriasHechas = categoriasExistentes;
        panelCategorias = panel;
        opciones = adicionales;
        contrasenaEncriptada = claveSecreta;
        this.encriptador = encriptador;
        ArrayList<String> listaDeCategorias = categoriasHechas.getListaCategorias();
        //Agregar categorías adicionales al comboBox para eliminarlas.
        for (int i=4; i<listaDeCategorias.size(); i++){
            categoriaAEliminar.addItem(listaDeCategorias.get(i));
        }
        //Instanciar listener y agregarlo a los botones.
        Listener listener = new Listener();
        crearCategoriaBoton.addActionListener(listener);
        borrarCategoriaBoton.addActionListener(listener);
        reiniciarBoton.addActionListener(listener);
    }
    
    /**
     * Clase interna que indica al panel que realizar al ser presionado cierto botón.
     */
    private class Listener implements ActionListener{

        @Override
        /**
         * Indica al programa que realizar según el botón que se presiona
         */
        public void actionPerformed(ActionEvent e) {
            if (crearCategoriaBoton.equals(e.getSource())){
                //Al presionar el botón de crear categoría.
                String nombre = ingresoNuevaCategoria.getText();
                if(categoriasHechas.noExisteCategoria(nombre)){
                    Categoria nueva = new Categoria(baseDatos, nombre,"id", "Titulo", "Contraseña");                   
                    if(nueva.isFine()){
                        Tabla tablita=new Tabla(baseDatos, nueva, panelCategorias.getEncriptador());
                        panelCategorias.addTab(nombre, tablita);
                        categoriasHechas.agregarCategoria(nueva);
                        opciones.agregarTabla(tablita);
                    }
                }else{
                    JOptionPane.showMessageDialog(null, "No se pudo crear, intente otro nombre");
                } 
                ingresoNuevaCategoria.setText("");
            }else{
                if (borrarCategoriaBoton.equals(e.getSource())){
                    //Al presionar el botón para eliminar categoría.
                    String nombreCategoriaABorrar = (String) categoriaAEliminar.getModel().getSelectedItem();
                    if (!(nombreCategoriaABorrar == null)){
                        int opcion = JOptionPane.showConfirmDialog(null, "¿Realmente desea eliminar la categoría " + nombreCategoriaABorrar +"?", "Eliminar categoría", JOptionPane.YES_NO_OPTION);
                        if (opcion == 0){
                            Tabla tablaAEliminar = opciones.tablaABorrar(nombreCategoriaABorrar);
                            panelCategorias.remove(tablaAEliminar);                        
                            opciones.eliminarTabla(tablaAEliminar);
                            categoriasHechas.remove(nombreCategoriaABorrar);
                            baseDatos.eliminarTabla(nombreCategoriaABorrar);
                            JOptionPane.showMessageDialog(null, "Se ha eliminado la categoría " +  nombreCategoriaABorrar, "Operación Exitosa", JOptionPane.INFORMATION_MESSAGE);
                        }
                    }
                }else{
                    //Si se presiona el botón de reinicio.
                    if (reiniciarBoton.equals(e.getSource())){
                        String contrasena = encriptador.decrypt(contrasenaEncriptada);
                        JLabel label = new JLabel("<html><p align=center> Ingrese la contraseña maestra:</html>");
                        JPasswordField jpf = new JPasswordField();
                        JOptionPane.showMessageDialog(null, new Object[]{label, jpf}, "Confirmación", javax.swing.JOptionPane.OK_CANCEL_OPTION);
                        
                        String contrasenaIngresada=jpf.getText();
                        if(contrasenaIngresada.equals(contrasena)){
                            for (String nombreCategoria : categoriasHechas.getListaCategorias()){
                                Tabla tablaAEliminar = opciones.tablaABorrar(nombreCategoria);
                                panelCategorias.remove(tablaAEliminar);                        
                                opciones.eliminarTabla(tablaAEliminar);
                                baseDatos.eliminarTabla(nombreCategoria);
                            }
                            categoriasHechas.setListaCategorias(new ArrayList());
                            panelCategorias.reiniciar();
                            JOptionPane.showMessageDialog(null, "Su billetara ha sido reiniciada.", "Reinicio completado.", JOptionPane.INFORMATION_MESSAGE);
                        }else{
                            JOptionPane.showMessageDialog(null, "<html>Contraseña maestra incorrecta.<br>No se ha reiniciado la billetera.</html>", "Acción denegada", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                }
            }
            //Se actualiza la lista de categorías adicionales existentes a mostrar en el comboBox.
            categoriaAEliminar.removeAllItems();
            ArrayList<String> listaDeCategorias = categoriasHechas.getListaCategorias();
            for (int i=4; i<listaDeCategorias.size(); i++){
                categoriaAEliminar.addItem(listaDeCategorias.get(i));
            }
        }    
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        panelCambio = new javax.swing.JPanel();
        tituloContrasena1 = new javax.swing.JLabel();
        ingresoContrasenaAnterior = new javax.swing.JPasswordField();
        ingresoContrasenaNueva = new javax.swing.JPasswordField();
        tituloContrasena2 = new javax.swing.JLabel();
        confirmacionContrasenaNueva = new javax.swing.JPasswordField();
        tituloContrasena3 = new javax.swing.JLabel();
        cambiarContrasenaBoton = new javax.swing.JButton();
        panelControl = new javax.swing.JPanel();
        crearCategoriaBoton = new javax.swing.JButton();
        controlTitulo1 = new javax.swing.JLabel();
        ingresoNuevaCategoria = new javax.swing.JTextField();
        controlTitulo2 = new javax.swing.JLabel();
        borrarCategoriaBoton = new javax.swing.JButton();
        categoriaAEliminar = new javax.swing.JComboBox();
        controlTitulo3 = new javax.swing.JLabel();
        reiniciarBoton = new javax.swing.JButton();

        panelCambio.setBorder(javax.swing.BorderFactory.createTitledBorder("Cambio de contraseña maestra"));

        tituloContrasena1.setText("Contraseña maestra");

        tituloContrasena2.setText("Nueva contraseña maestra");

        tituloContrasena3.setText("Repita nueva contraseña maestra");

        cambiarContrasenaBoton.setText("Cambiar contraseña maestra");
        cambiarContrasenaBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cambiarContrasenaBotonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelCambioLayout = new javax.swing.GroupLayout(panelCambio);
        panelCambio.setLayout(panelCambioLayout);
        panelCambioLayout.setHorizontalGroup(
            panelCambioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelCambioLayout.createSequentialGroup()
                .addContainerGap(217, Short.MAX_VALUE)
                .addComponent(cambiarContrasenaBoton)
                .addContainerGap())
            .addGroup(panelCambioLayout.createSequentialGroup()
                .addGap(43, 43, 43)
                .addGroup(panelCambioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(panelCambioLayout.createSequentialGroup()
                        .addComponent(tituloContrasena2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(ingresoContrasenaNueva, javax.swing.GroupLayout.PREFERRED_SIZE, 175, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelCambioLayout.createSequentialGroup()
                        .addComponent(tituloContrasena1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(ingresoContrasenaAnterior, javax.swing.GroupLayout.PREFERRED_SIZE, 175, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(24, Short.MAX_VALUE))
            .addGroup(panelCambioLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(tituloContrasena3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(confirmacionContrasenaNueva, javax.swing.GroupLayout.PREFERRED_SIZE, 175, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(13, Short.MAX_VALUE))
        );
        panelCambioLayout.setVerticalGroup(
            panelCambioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelCambioLayout.createSequentialGroup()
                .addGroup(panelCambioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(ingresoContrasenaAnterior, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tituloContrasena1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelCambioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(ingresoContrasenaNueva, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tituloContrasena2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelCambioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(tituloContrasena3)
                    .addComponent(confirmacionContrasenaNueva, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(16, 16, 16)
                .addComponent(cambiarContrasenaBoton))
        );

        panelControl.setBorder(javax.swing.BorderFactory.createTitledBorder("Control de categorías"));

        crearCategoriaBoton.setText("Crear");
        crearCategoriaBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                crearCategoriaBotonActionPerformed(evt);
            }
        });

        controlTitulo1.setText("Nueva Categoría");

        ingresoNuevaCategoria.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ingresoNuevaCategoriaActionPerformed(evt);
            }
        });

        controlTitulo2.setText("Eliminar Categoría");

        borrarCategoriaBoton.setText("Borrar");
        borrarCategoriaBoton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                borrarCategoriaBotonActionPerformed(evt);
            }
        });

        controlTitulo3.setText("Borrado general");

        reiniciarBoton.setText("Reiniciar");

        javax.swing.GroupLayout panelControlLayout = new javax.swing.GroupLayout(panelControl);
        panelControl.setLayout(panelControlLayout);
        panelControlLayout.setHorizontalGroup(
            panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelControlLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(controlTitulo2)
                    .addComponent(controlTitulo1))
                .addGap(18, 18, 18)
                .addGroup(panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(ingresoNuevaCategoria, javax.swing.GroupLayout.DEFAULT_SIZE, 218, Short.MAX_VALUE)
                    .addComponent(categoriaAEliminar, 0, 218, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(crearCategoriaBoton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(borrarCategoriaBoton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
            .addGroup(panelControlLayout.createSequentialGroup()
                .addGap(103, 103, 103)
                .addComponent(controlTitulo3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(reiniciarBoton)
                .addContainerGap(146, Short.MAX_VALUE))
        );
        panelControlLayout.setVerticalGroup(
            panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelControlLayout.createSequentialGroup()
                .addGroup(panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(crearCategoriaBoton)
                    .addComponent(ingresoNuevaCategoria, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(controlTitulo1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(controlTitulo2)
                    .addComponent(borrarCategoriaBoton)
                    .addComponent(categoriaAEliminar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(controlTitulo3)
                    .addComponent(reiniciarBoton)))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(panelControl, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(panelCambio, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelControl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(panelCambio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(30, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void cambiarContrasenaBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cambiarContrasenaBotonActionPerformed
        String contrasenaVieja=ingresoContrasenaAnterior.getText();
        String contrasenaNueva1=ingresoContrasenaNueva.getText();
        String contrasenaNueva2=confirmacionContrasenaNueva.getText();
        if(!(contrasenaVieja.equals("")||contrasenaNueva1.equals("")||contrasenaNueva2.equals(""))){
            if(contrasenaNueva1.equals(contrasenaNueva2)){
                String contrasenaReal=encriptador.decrypt(contrasenaEncriptada);
                if(contrasenaReal.equals(contrasenaVieja)){
                    StringEncrypter encriptador2=new StringEncrypter(contrasenaNueva1);
                    opciones.reEncriptar(encriptador2);
                    String contrasenaNuevaEncriptada=encriptador2.encrypt(contrasenaNueva1);
                    Principal.cambiarContrasena(contrasenaNuevaEncriptada,encriptador2);
                }else{
                JOptionPane.showMessageDialog(panelCambio,"Contraseña Anterior Incorrecta");
                }
            }else{
                JOptionPane.showMessageDialog(panelCambio,"No coincide la contraseña con su confirmación");
            }
        }   
    }//GEN-LAST:event_cambiarContrasenaBotonActionPerformed

    private void ingresoNuevaCategoriaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ingresoNuevaCategoriaActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_ingresoNuevaCategoriaActionPerformed

    private void borrarCategoriaBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_borrarCategoriaBotonActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_borrarCategoriaBotonActionPerformed

    private void crearCategoriaBotonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_crearCategoriaBotonActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_crearCategoriaBotonActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton borrarCategoriaBoton;
    private javax.swing.JButton cambiarContrasenaBoton;
    private javax.swing.JComboBox categoriaAEliminar;
    private javax.swing.JPasswordField confirmacionContrasenaNueva;
    private javax.swing.JLabel controlTitulo1;
    private javax.swing.JLabel controlTitulo2;
    private javax.swing.JLabel controlTitulo3;
    private javax.swing.JButton crearCategoriaBoton;
    private javax.swing.JPasswordField ingresoContrasenaAnterior;
    private javax.swing.JPasswordField ingresoContrasenaNueva;
    private javax.swing.JTextField ingresoNuevaCategoria;
    private javax.swing.JPanel panelCambio;
    private javax.swing.JPanel panelControl;
    private javax.swing.JButton reiniciarBoton;
    private javax.swing.JLabel tituloContrasena1;
    private javax.swing.JLabel tituloContrasena2;
    private javax.swing.JLabel tituloContrasena3;
    // End of variables declaration//GEN-END:variables
    
     
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */

}
